# 31. 面向对象总结
# 面向对象
一直都在说python一切都是对象,那么面向对象什么时候用合适,也不是所有的都适合面向对象
- 在代码量多的时候
- 处理比较复杂角色之间的关系的时候
- 如QQ的关系,简单来说:QQ分为,好友、情侣、陌生人、群员、组员等等
- 如复杂的电商程序关系等
- 如复杂的人员架构关系等
- 可以将自身的代码理清晰化
- 提高代码的可读性,能够明确分辨出每个角色拥有的方法和属性
- 增强了代码可扩展性
- 增加了代码的复用性
- 使自身的代码更加规范化,更加合理
在python中,一切皆为对象,无论是基本数据类型还是其他,都是对象
类:类还分为元类跟父类
在python中,如果创建一个类,没有指定元类跟父类,那么python默认的自动的将其归为默认的元类跟父类,元类:type,父类:object
例如抽象类,如果把一个普通的类转化成抽象类,class 类名(metaclass=ABCMeta),只有把类中的默认元类转成ABCMeta类,这个类才是抽象类
from abc import ABCMeta,abstractmethod
class a:pass
class b(metaclass=ABCMeta):pass
print(type(a))
print(type(b))
执行结果:
<class 'type'>
<class 'abc.ABCMeta'>
很明确的指出类的元类是那个
又可以这样说
- class 类名(metaclass=ABCMeta),这抽象类是Python解释器使用ABCMeta来创建,那么ABCMeta就是这个类的元类
- clasas 类名,这类没有指定用什么来创建,那么Python解释器会默认使用type来创建,那么type就是这类的元类
类跟对象的执行过程
类:
- 生成一个类空间
- 把类中的静态属性执行一遍并保存在类空间中
- 把类中的动态方法(属性)的内存地址保存在类空间中
- 最后在把类空间赋值给类名
对象(实例化过程):
- 生成一个对象空间
- 使用__new__来创建一个对象空间,如果类中没有__new__方法,那会去父类中找
- 创建完毕,并把这对象空间的内存地址返回给__init__方法
- 把__init__方法中的属性加载到对象空间中
- 如果__init__方法中函数方法,那么对象空间也只会保存函数方法的内存地址
- 在对象本身中只会存储一些只属对象的属性
- 在生成一个指针,这个指针称为:类指针,记录着当前类的内存地址,方便对象去类中查找
- 最后把生成的对象空间赋值给调用者
组合:什么有什么关系,把一个类的对象作为另一个类对象的属性
继承
继承分为:单继承跟多继承
单继承: